709 lines
15 KiB
HTML
709 lines
15 KiB
HTML
<!doctype html>
|
||
<html lang="en">
|
||
<head>
|
||
<meta charset="utf-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
<title>Completion</title>
|
||
<meta name="description" content="The long-running and erratically updated blog of Kathleen Fitzpatrick.">
|
||
<link rel="alternate" href="feed/feed.xml" type="application/atom+xml" title="kfitz">
|
||
<script async="" src="https://talk.hyvor.com/embed/embed.js" type="module"></script>
|
||
<link rel="webmention" href="https://webmention.io/kfitz.info/webmention">
|
||
<link rel="pingback" href="https://webmention.io/kfitz.info/xmlrpc">
|
||
|
||
|
||
|
||
|
||
|
||
<style>/**
|
||
* okaidia theme for JavaScript, CSS and HTML
|
||
* Loosely based on Monokai textmate theme by http://www.monokai.nl/
|
||
* @author ocodia
|
||
*/
|
||
|
||
code[class*="language-"],
|
||
pre[class*="language-"] {
|
||
color: #f8f8f2;
|
||
background: none;
|
||
text-shadow: 0 1px rgba(0, 0, 0, 0.3);
|
||
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
|
||
font-size: 1em;
|
||
text-align: left;
|
||
white-space: pre;
|
||
word-spacing: normal;
|
||
word-break: normal;
|
||
word-wrap: normal;
|
||
line-height: 1.5;
|
||
|
||
-moz-tab-size: 4;
|
||
-o-tab-size: 4;
|
||
tab-size: 4;
|
||
|
||
-webkit-hyphens: none;
|
||
-moz-hyphens: none;
|
||
-ms-hyphens: none;
|
||
hyphens: none;
|
||
}
|
||
|
||
/* Code blocks */
|
||
pre[class*="language-"] {
|
||
padding: 1em;
|
||
margin: .5em 0;
|
||
overflow: auto;
|
||
border-radius: 0.3em;
|
||
}
|
||
|
||
:not(pre) > code[class*="language-"],
|
||
pre[class*="language-"] {
|
||
background: #272822;
|
||
}
|
||
|
||
/* Inline code */
|
||
:not(pre) > code[class*="language-"] {
|
||
padding: .1em;
|
||
border-radius: .3em;
|
||
white-space: normal;
|
||
}
|
||
|
||
.token.comment,
|
||
.token.prolog,
|
||
.token.doctype,
|
||
.token.cdata {
|
||
color: #8292a2;
|
||
}
|
||
|
||
.token.punctuation {
|
||
color: #f8f8f2;
|
||
}
|
||
|
||
.token.namespace {
|
||
opacity: .7;
|
||
}
|
||
|
||
.token.property,
|
||
.token.tag,
|
||
.token.constant,
|
||
.token.symbol,
|
||
.token.deleted {
|
||
color: #f92672;
|
||
}
|
||
|
||
.token.boolean,
|
||
.token.number {
|
||
color: #ae81ff;
|
||
}
|
||
|
||
.token.selector,
|
||
.token.attr-name,
|
||
.token.string,
|
||
.token.char,
|
||
.token.builtin,
|
||
.token.inserted {
|
||
color: #a6e22e;
|
||
}
|
||
|
||
.token.operator,
|
||
.token.entity,
|
||
.token.url,
|
||
.language-css .token.string,
|
||
.style .token.string,
|
||
.token.variable {
|
||
color: #f8f8f2;
|
||
}
|
||
|
||
.token.atrule,
|
||
.token.attr-value,
|
||
.token.function,
|
||
.token.class-name {
|
||
color: #e6db74;
|
||
}
|
||
|
||
.token.keyword {
|
||
color: #66d9ef;
|
||
}
|
||
|
||
.token.regex,
|
||
.token.important {
|
||
color: #fd971f;
|
||
}
|
||
|
||
.token.important,
|
||
.token.bold {
|
||
font-weight: bold;
|
||
}
|
||
.token.italic {
|
||
font-style: italic;
|
||
}
|
||
|
||
.token.entity {
|
||
cursor: help;
|
||
}
|
||
/*
|
||
* New diff- syntax
|
||
*/
|
||
|
||
pre[class*="language-diff-"] {
|
||
--eleventy-code-padding: 1.25em;
|
||
padding-left: var(--eleventy-code-padding);
|
||
padding-right: var(--eleventy-code-padding);
|
||
}
|
||
.token.deleted {
|
||
background-color: hsl(0, 51%, 37%);
|
||
color: inherit;
|
||
}
|
||
.token.inserted {
|
||
background-color: hsl(126, 31%, 39%);
|
||
color: inherit;
|
||
}
|
||
|
||
/* Make the + and - characters unselectable for copy/paste */
|
||
.token.prefix.unchanged,
|
||
.token.prefix.inserted,
|
||
.token.prefix.deleted {
|
||
-webkit-user-select: none;
|
||
user-select: none;
|
||
display: inline-flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
padding-top: 2px;
|
||
padding-bottom: 2px;
|
||
}
|
||
.token.prefix.inserted,
|
||
.token.prefix.deleted {
|
||
width: var(--eleventy-code-padding);
|
||
background-color: rgba(0,0,0,.2);
|
||
}
|
||
|
||
/* Optional: full-width background color */
|
||
.token.inserted:not(.prefix),
|
||
.token.deleted:not(.prefix) {
|
||
display: block;
|
||
margin-left: calc(-1 * var(--eleventy-code-padding));
|
||
margin-right: calc(-1 * var(--eleventy-code-padding));
|
||
text-decoration: none; /* override del, ins, mark defaults */
|
||
color: inherit; /* override del, ins, mark defaults */
|
||
}
|
||
/* This is an arbitrary CSS string added to the bundle */
|
||
/* Defaults */
|
||
@font-face {
|
||
font-family: "Atkinson Hyperlegible";
|
||
src: url('/css/files/atkinson-hyperlegible-latin-400-normal.woff2') format('woff2');
|
||
font-display: swap;
|
||
}
|
||
@font-face {
|
||
font-family: "Atkinson Hyperlegible";
|
||
font-weight: bold;
|
||
src: url('/css/files/atkinson-hyperlegible-latin-700-normal.woff2') format('woff2');
|
||
font-display: swap;
|
||
}
|
||
@font-face {
|
||
font-family: "Atkinson Hyperlegible";
|
||
font-style: italic
|
||
src: url('/css/files/atkinson-hyperlegible-latin-400-italic.woff2') format('woff2');
|
||
font-display: swap;
|
||
}
|
||
|
||
:root {
|
||
--font-family: "Atkinson Hyperlegible", -apple-system, system-ui, sans-serif;
|
||
--font-family-monospace: Consolas, Menlo, Monaco, Andale Mono WT, Andale Mono, Lucida Console, Lucida Sans Typewriter, DejaVu Sans Mono, Bitstream Vera Sans Mono, Liberation Mono, Nimbus Mono L, Courier New, Courier, monospace;
|
||
font-size: 18px;
|
||
}
|
||
|
||
/* Theme colors */
|
||
:root {
|
||
--color-gray-20: #e0e0e0;
|
||
--color-gray-50: #C0C0C0;
|
||
--color-gray-90: #333;
|
||
|
||
--background-color: #fff;
|
||
|
||
--text-color: var(--color-gray-90);
|
||
--text-color-link: #d61d4a;
|
||
--text-color-link-active: #853439;
|
||
--text-color-link-visited: #e8325e;
|
||
|
||
--syntax-tab-size: 2;
|
||
}
|
||
|
||
@media (prefers-color-scheme: dark) {
|
||
:root {
|
||
--color-gray-20: #e0e0e0;
|
||
--color-gray-50: #C0C0C0;
|
||
--color-gray-90: #dad8d8;
|
||
|
||
/* --text-color is assigned to --color-gray-_ above */
|
||
--text-color-link: #1493fb;
|
||
--text-color-link-active: #6969f7;
|
||
--text-color-link-visited: #a6a6f8;
|
||
|
||
--background-color: #15202b;
|
||
}
|
||
}
|
||
|
||
|
||
/* Global stylesheet */
|
||
* {
|
||
box-sizing: border-box;
|
||
}
|
||
|
||
@view-transition {
|
||
navigation: auto;
|
||
}
|
||
|
||
html,
|
||
body {
|
||
padding: 0;
|
||
margin: 0 auto;
|
||
font-family: var(--font-family);
|
||
color: var(--text-color);
|
||
background-color: var(--background-color);
|
||
}
|
||
html {
|
||
overflow-y: scroll;
|
||
}
|
||
body {
|
||
max-width: 40em;
|
||
}
|
||
|
||
/* https://www.a11yproject.com/posts/how-to-hide-content/ */
|
||
.visually-hidden {
|
||
clip: rect(0 0 0 0);
|
||
clip-path: inset(50%);
|
||
height: 1px;
|
||
overflow: hidden;
|
||
position: absolute;
|
||
white-space: nowrap;
|
||
width: 1px;
|
||
}
|
||
|
||
p:last-child {
|
||
margin-bottom: 0;
|
||
}
|
||
p {
|
||
line-height: 1.5;
|
||
}
|
||
|
||
li {
|
||
line-height: 1.5;
|
||
}
|
||
|
||
a[href] {
|
||
color: var(--text-color-link);
|
||
}
|
||
a[href]:visited {
|
||
color: var(--text-color-link-visited);
|
||
}
|
||
a[href]:hover,
|
||
a[href]:active {
|
||
color: var(--text-color-link-active);
|
||
}
|
||
|
||
main,
|
||
footer {
|
||
padding: 1rem;
|
||
}
|
||
main :first-child {
|
||
margin-top: 0;
|
||
}
|
||
|
||
header {
|
||
border-bottom: 1px dashed var(--color-gray-20);
|
||
}
|
||
header:after {
|
||
content: "";
|
||
display: table;
|
||
clear: both;
|
||
}
|
||
|
||
footer {
|
||
border-top: 1px dashed var(--color-gray-50);
|
||
}
|
||
|
||
.links-nextprev {
|
||
display: flex;
|
||
justify-content: space-between;
|
||
gap: .5em 1em;
|
||
list-style: "";
|
||
border-top: 1px dashed var(--color-gray-20);
|
||
padding: 1em 0;
|
||
}
|
||
.links-nextprev > * {
|
||
flex-grow: 1;
|
||
}
|
||
.links-nextprev-next {
|
||
text-align: right;
|
||
}
|
||
|
||
table {
|
||
margin: 1em 0;
|
||
}
|
||
table td,
|
||
table th {
|
||
padding-right: 1em;
|
||
}
|
||
|
||
pre,
|
||
code {
|
||
font-family: var(--font-family-monospace);
|
||
}
|
||
pre:not([class*="language-"]) {
|
||
margin: .5em 0;
|
||
line-height: 1.375; /* 22px /16 */
|
||
-moz-tab-size: var(--syntax-tab-size);
|
||
-o-tab-size: var(--syntax-tab-size);
|
||
tab-size: var(--syntax-tab-size);
|
||
-webkit-hyphens: none;
|
||
-ms-hyphens: none;
|
||
hyphens: none;
|
||
direction: ltr;
|
||
text-align: left;
|
||
white-space: pre;
|
||
word-spacing: normal;
|
||
word-break: normal;
|
||
overflow-x: auto;
|
||
}
|
||
code {
|
||
word-break: break-all;
|
||
}
|
||
|
||
/* Header */
|
||
header {
|
||
display: flex;
|
||
gap: 1em .5em;
|
||
flex-wrap: wrap;
|
||
align-items: center;
|
||
padding: 1em;
|
||
}
|
||
.home-link {
|
||
font-size: 1.5em; /* 16px /16 */
|
||
font-weight: 700;
|
||
margin-right: 2em;
|
||
}
|
||
.home-link:link:not(:hover) {
|
||
text-decoration: none;
|
||
}
|
||
|
||
/* Nav */
|
||
.nav {
|
||
display: flex;
|
||
padding: 0;
|
||
margin: 0;
|
||
list-style: none;
|
||
}
|
||
.nav-item {
|
||
display: inline-block;
|
||
margin-right: 1em;
|
||
}
|
||
.nav-item a[href]:not(:hover) {
|
||
text-decoration: none;
|
||
}
|
||
.nav a[href][aria-current="page"] {
|
||
text-decoration: underline;
|
||
}
|
||
|
||
/* Posts list */
|
||
.postlist {
|
||
list-style: none;
|
||
padding: 0;
|
||
padding-left: 1.5rem;
|
||
}
|
||
.postlist-item {
|
||
display: flex;
|
||
flex-wrap: wrap;
|
||
align-items: baseline;
|
||
counter-increment: start-from -1;
|
||
margin-bottom: 1em;
|
||
}
|
||
.postlist-item:before {
|
||
display: inline-block;
|
||
pointer-events: none;
|
||
content: "" counter(start-from, decimal-leading-zero) ". ";
|
||
line-height: 100%;
|
||
text-align: right;
|
||
margin-left: -1.5rem;
|
||
}
|
||
.postlist-date,
|
||
.postlist-item:before {
|
||
font-size: 0.8125em; /* 13px /16 */
|
||
color: var(--color-gray-90);
|
||
}
|
||
.postlist-date {
|
||
word-spacing: -0.5px;
|
||
}
|
||
.postlist-link {
|
||
font-size: 1.1875em; /* 19px /16 */
|
||
font-weight: 700;
|
||
flex-basis: calc(100% - 1.5rem);
|
||
padding-left: .25em;
|
||
padding-right: .5em;
|
||
text-underline-position: from-font;
|
||
text-underline-offset: 0;
|
||
text-decoration-thickness: 1px;
|
||
}
|
||
.postlist-item-active .postlist-link {
|
||
font-weight: bold;
|
||
}
|
||
|
||
/* Archive list */
|
||
.archivelist {
|
||
padding: 0;
|
||
padding-left: 2.5rem;
|
||
}
|
||
.archivelist-item {
|
||
align-items: baseline;
|
||
margin-bottom: 1em;
|
||
}
|
||
.archivelist-item::marker {
|
||
text-align: right;
|
||
margin-left: -1.5rem;
|
||
font-size: 0.8125em; /* 13px /16 */
|
||
color: var(--color-gray-90);
|
||
}
|
||
.archivelist-date {
|
||
font-size: 0.8125em; /* 13px /16 */
|
||
color: var(--color-gray-90);
|
||
word-spacing: -0.5px;
|
||
}
|
||
.archivelist-link {
|
||
font-size: 1.1875em; /* 19px /16 */
|
||
font-weight: 700;
|
||
flex-basis: calc(100% - 1.5rem);
|
||
padding-left: .25em;
|
||
padding-right: .5em;
|
||
text-underline-position: from-font;
|
||
text-underline-offset: 0;
|
||
text-decoration-thickness: 1px;
|
||
}
|
||
.archivelist-item-active .archivelist-link {
|
||
font-weight: bold;
|
||
}
|
||
|
||
|
||
/* Tags */
|
||
.post-tag {
|
||
display: inline-flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
text-transform: capitalize;
|
||
font-style: italic;
|
||
}
|
||
.postlist-item > .post-tag {
|
||
align-self: center;
|
||
}
|
||
|
||
/* Tags list */
|
||
.post-metadata {
|
||
display: inline-flex;
|
||
flex-wrap: wrap;
|
||
gap: .5em;
|
||
list-style: none;
|
||
border-top: 1px dashed var(--color-gray-20);
|
||
border-bottom: 1px dashed var(--color-gray-20);
|
||
padding: 3px 0px 3px 0px;
|
||
margin: 0;
|
||
font-size: .8em;
|
||
}
|
||
.post-metadata time {
|
||
margin-right: 1em;
|
||
}
|
||
|
||
/* Direct Links / Markdown Headers */
|
||
.header-anchor {
|
||
text-decoration: none;
|
||
font-style: normal;
|
||
font-size: 1em;
|
||
margin-left: .1em;
|
||
}
|
||
a[href].header-anchor,
|
||
a[href].header-anchor:visited {
|
||
color: transparent;
|
||
}
|
||
a[href].header-anchor:focus,
|
||
a[href].header-anchor:hover {
|
||
text-decoration: underline;
|
||
}
|
||
a[href].header-anchor:focus,
|
||
:hover > a[href].header-anchor {
|
||
color: #aaa;
|
||
}
|
||
|
||
h2 + .header-anchor {
|
||
font-size: 1.5em;
|
||
font-weight: bold;
|
||
}
|
||
|
||
h1 {
|
||
font-weight: bolder;
|
||
}
|
||
|
||
summary {
|
||
font-size: 1.5em;
|
||
font-weight: bold;
|
||
margin-bottom: .5em;
|
||
}
|
||
|
||
img {
|
||
display: block;
|
||
margin-left: auto;
|
||
margin-right: auto;
|
||
}
|
||
|
||
blockquote {
|
||
display: block;
|
||
margin-left: 2em;
|
||
margin-right: 3em;
|
||
padding-left: 10px;
|
||
border-left: 10px solid var(--text-color-link);
|
||
}
|
||
|
||
hr.new {
|
||
border: none;
|
||
border-top: 1px dashed var(--color-gray-50);
|
||
}
|
||
/* Webmention Section */
|
||
|
||
.webmentions {
|
||
display:block;
|
||
text-align: left;
|
||
}
|
||
.webmentions__facepile {
|
||
display:flex;
|
||
align-items: center;
|
||
flex-wrap: wrap;
|
||
}
|
||
.webmentions__face {
|
||
width: 2rem;
|
||
height: 2rem;
|
||
border-radius: 50%;
|
||
object-fit: cover;
|
||
flex: none;
|
||
}
|
||
.webmentions__list {
|
||
list-style-type: none;
|
||
padding:0;
|
||
}
|
||
.webmentions__item {
|
||
margin-bottom: 2rem;
|
||
}
|
||
|
||
/* Single Webmention */
|
||
|
||
.webmention {
|
||
display:block;
|
||
}
|
||
.webmention__meta,
|
||
.webmention__author {
|
||
display: flex;
|
||
align-items: center;
|
||
flex-wrap: wrap;
|
||
}
|
||
.webmention__meta {
|
||
margin-bottom:.5rem;
|
||
}
|
||
.webmention__author {
|
||
margin-right:.25rem;
|
||
}
|
||
.webmention__author__photo {
|
||
height: 3rem;
|
||
width: 3rem;
|
||
border-radius: 50%;
|
||
object-fit: cover;
|
||
margin-right:.5rem;
|
||
}
|
||
.webmention__pubdate {
|
||
font-style: italic;
|
||
}
|
||
/* Message Box */
|
||
.message-box {
|
||
--color-message-box: #ffc;
|
||
|
||
display: block;
|
||
background-color: var(--color-message-box);
|
||
color: var(--color-gray-90);
|
||
padding: 1em 0.625em; /* 16px 10px /16 */
|
||
}
|
||
.message-box ol {
|
||
margin-top: 0;
|
||
}
|
||
|
||
@media (prefers-color-scheme: dark) {
|
||
.message-box {
|
||
--color-message-box: #082840;
|
||
}
|
||
}</style>
|
||
</head>
|
||
<body>
|
||
<a href="#skip" class="visually-hidden">Skip to main content</a>
|
||
|
||
<header>
|
||
<a href="/" class="home-link">kfitz</a>
|
||
<nav>
|
||
<h2 class="visually-hidden" id="top-level-navigation-menu">Top level navigation menu</h2>
|
||
<ul class="nav">
|
||
<li class="nav-item"><a href="/">Home</a></li>
|
||
<li class="nav-item"><a href="/blog/">Archive</a></li>
|
||
<li class="nav-item"><a href="/about/">About</a></li>
|
||
<li class="nav-item"><a href="/projects/">Projects</a></li>
|
||
<li class="nav-item"><a href="/presentations/">Presentations</a></li>
|
||
<li class="nav-item"><a href="/teaching/">Teaching</a></li>
|
||
<li class="nav-item"><a href="/feed/feed.xml">Feed</a></li>
|
||
</ul>
|
||
</nav>
|
||
</header>
|
||
|
||
<link href="/pagefind/pagefind-ui.css" rel="stylesheet">
|
||
<script src="/pagefind/pagefind-ui.js"></script>
|
||
<div id="search"></div>
|
||
<script>
|
||
window.addEventListener('DOMContentLoaded', (event) => {
|
||
new PagefindUI({ element: "#search", showSubResults: true });
|
||
});
|
||
</script>
|
||
|
||
<main id="skip">
|
||
<heading-anchors>
|
||
|
||
<h1 id="completion">Completion</h1>
|
||
|
||
<ul class="post-metadata">
|
||
<li><time datetime="2007-07-27">27 July 2007</time></li>
|
||
<li><a href="/tags/software/" class="post-tag">software</a></li>
|
||
</ul>
|
||
|
||
<p>I’ve been taking all my research notes in <a href="http://macromates.com/">TextMate</a> for a while now, which, as text editors go, is really <em>way</em> more powerful than what I need. What I like about it, though, is the notion of the “project” — a cluster of text docs that you designate as being somehow related. I have this project called, brilliantly, “notes,” through which I’ve related most of my work-based notes, whether notes on projects, notes from conferences or conference calls, or notes on reading. In the project drawer there are several little folders that group those notes in meaningful ways, and using that drawer, I can open and close whichever of them I need at any given moment. In tabs. That’s the key point: TextMate has tabbed editing windows.</p>
|
||
<p>But it’s also got this groovy feature that I’ve been using like crazy in the last few days: completion. Say there’s a word you’ve typed earlier in your document, as you’ve been taking your research notes, and say it’s a word that comes up a lot, and is really annoying to type. Like “antidescriptivism.” Once you’ve typed it once, you can type the first few letters, like “ant,” and then hit the escape key, and TextMate will automatically complete the word with the last word you typed that began with “ant.” But say that the second time I need the word, I actually need “antidescriptivist”? So I complete, I hit backspace and change the “m” to a “t,” and I’m done. Now, the next time I type “ant” and hit escape, TextMate will finish the word with “antidescriptivist,” but if I really wanted “antidescriptivism,” all I have to do is hit escape a second time, to get the second-to-last word I typed that began with “ant.”</p>
|
||
<p>This is saving me enormous amounts of time. How much? Enough, I hope, to write this post about it.</p>
|
||
|
||
<ul class="links-nextprev"><li class="links-nextprev-prev">← Previous<br> <a href="/more-anxiety-other-obsolescences/">More Anxiety, Other Obsolescences</a></li><li class="links-nextprev-next">Next →<br><a href="/back-to-work-with-you-then/">Back to Work with You, Then</a></li>
|
||
</ul>
|
||
|
||
<hyvor-talk-comments website-id="9100" page-id="/completion/"></hyvor-talk-comments>
|
||
|
||
<div class="webmentions" id="webmentions">
|
||
<h3 id="webmentions-2">Webmentions</h3>
|
||
|
||
|
||
<p>No replies yet.</p>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
</div>
|
||
|
||
|
||
</heading-anchors>
|
||
</main>
|
||
|
||
<footer>
|
||
<p><em>Built with <a href="https://www.11ty.dev/">Eleventy v3.0.0</a>. All content <a href="https://creativecommons.org/licenses/by/4.0/deed.en">CC BY 4.0</a> if you're human.</em></p><p></p>
|
||
</footer>
|
||
|
||
<!-- This page `/completion/` was built on 2024-12-21T14:13:06.317Z -->
|
||
<script type="module" src="/dist/rJ3_G-2ArF.js"></script>
|
||
</body>
|
||
</html>
|