As a non-native English speaker who reads, writes and reviews lots of English texts, I frequently look up definitions as well as synonyms of words. Of course there are numerous online sources available to do this, but I like to decrease my online 'footprint' due to privacy reasons. It also takes extra time to switch to a browser window and enter a search query.
Fortunately the fine folks at Princeton University compiled WordNet [1], a large lexical database of English, which can be used offline - together with a tool to search that database. Even better, somebody wrote a package to use WordNet inside my favorite editor Emacs [2]. This means that just by hovering the cursor over a word inside Emacs, the definition as well as synonyms can be shown. The source code [3] is kindly provided by Princeton University.
Compiling WordNet using MSYS2 on/for Windows
As is usually the case, compiling on/for Windows using the MSYS2 subsystem [4] can be done, with a few minor tweaks.
First, start a MSYS2 shell and install the required dependencies (build tools,
as well as the programming language
Tcl
and its widget toolkit
Tk
):
pacman -Sy --noconfirm base-devel mingw-w64-x86_64-tcl mingw-w64-x86_64-tk
Then download the source code [3] as well as the latest database files [5] using
wget
, and unpack both:
wget http://wordnetcode.princeton.edu/3.0/WordNet-3.0.tar.gz
wget http://wordnetcode.princeton.edu/wn3.1.dict.tar.gz
tar -xzvf WordNet-3.0.tar.gz
cd WordNet-3.0
tar -xzvf ../wn3.1.dict.tar.gz
Run configure...
./configure
...and run into the first hurdle:
WARNING: Can't find Tk configuration definitions
The compiler script warns about not being able to find
Tk
configuration
definitions. Looking at the
configure
script, the file it is looking for
is
tkConfig.sh
. On MSYS2, this file has been is installed under
/mingw64/lib/tkConfig.sh
and this location can directly be passed as
parameter. The same holds true for the
Tck
configuration definitions:
./configure --with-tcl='/mingw64/lib/' --with-tk='/mingw64/lib/'
Now the configure script succeeds. The next step, compiling the program unfortunately fails at first run:
make
error: 'Tcl_Interp' {aka 'struct Tcl_Interp'} has no member named 'result'
This hints at an incorrect version of
Tcl
being expected. Fortunately
this can be solved [6] by defining a constant (
USE_INTERP_RESULT
) while
compiling, either in the source code or on the command line. As it's best not to
touch the source, I opt for the command line:
CFLAGS="-DUSE_INTERP_RESULT" ./configure --with-tcl='/mingw64/lib/' --with-tk='/mingw64/lib/'
After this the program compiles successfully on MSYS2, running on Windows 10. The next step now strips the binaries and installs it, ready to be used on the system.
make install-strip
After this, when running the executable
wn
it still complains about not
being able to open data and index files:
WordNet library error: Can't open datafile(/mingw64/dict/data.noun) WordNet library error: Can't open indexfile(/mingw64/dict/index.noun) WordNet library error: Can't open datafile(/mingw64/dict/data.verb) WordNet library error: Can't open indexfile(/mingw64/dict/index.verb) WordNet library error: Can't open datafile(/mingw64/dict/data.adj) WordNet library error: Can't open indexfile(/mingw64/dict/index.adj) WordNet library error: Can't open datafile(/mingw64/dict/data.adv) WordNet library error: Can't open indexfile(/mingw64/dict/index.adv) WordNet library warning: Can't open verb example sentence file(/mingw64/dict/sents.vrb) WordNet library warning: Can't open verb example sentence index file(/mingw64/dict/sentidx.vrb) wn: Fatal error - cannot open WordNet database
The instructions point out that the environment variable
WNHOME
needs to
be set, pointing to the installation directory. After that, the binary seems to work:
export WNHOME=/mingw64
wn successful -over
Using WordNet with Emacs using helm
Next up is tying WordNet to Emacs. This is a matter of installing the packages
helm
and
helm-wordnet
, and setting the variable
helm-wordnet-wordnet-location
to contain the absolute path to the MSYS2
subsystem folder where WordNet installed its dictionary files. This is the same
as the 'virtual' path
/mingw64/dict
.
Personally I use use-package [7] for all Emacs package management: This code
snippet from the startup file
.init.el
expects that package to be
installed and will take care of all the heavy lifting.
(use-package helm
:ensure t
)
(use-package helm-wordnet
:after helm
:config (setq helm-wordnet-wordnet-location "/full/path/to/mingw64/lib")
:ensure t
:pin "melpa" ;; The package is only available at Melpa for the moment
)
If everything went well, you can execute the function
helm-wordnet-suggest
and Emacs will happily show synonyms and a definition.
Mission accomplished...
Note
On most Linux variants, installing WordNet is simply a case of using the
native package manager, e.g. on Debian
sudo apt-get install wordnet
[1] | https://wordnet.princeton.edu |
[2] | https://www.gnu.org/software/emacs/ |
[3] | (1, 2) http://wordnetcode.princeton.edu/3.0/WordNet-3.0.tar.gz |
[4] | https://msys2.github.io/ |
[5] | http://wordnetcode.princeton.edu/wn3.1.dict.tar.gz |
[6] | https://www.tcl.tk/man/tcl/TclLib/Interp.htm |
[7] | https://github.com/jwiegley/use-package |
Comments
comments powered by Disqus